{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from numpy import *\n",
    "import operator"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def createDataSet():\n",
    "    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])\n",
    "    labels = ['A', 'A', 'B', 'B']\n",
    "    return group, labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "group, labels = createDataSet()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1. , 1.1],\n",
       "       [1. , 1. ],\n",
       "       [0. , 0. ],\n",
       "       [0. , 0.1]])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "group"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['A', 'A', 'B', 'B']"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def classify0(inX, dataSet, labels, k):\n",
    "    dataSetSize = dataSet.shape[0]  # 0表示行数\n",
    "    diffMat = tile(inX, (dataSetSize, 1)) - dataSet  # 输入样例与数据集样例的差值\n",
    "    sqDiffMat = diffMat ** 2  # 差值的平方\n",
    "    sqDistances = sqDiffMat.sum(axis=1)  # 将每一行的值加起来\n",
    "    distances = sqDistances ** 0.5  # 求出距离矩阵\n",
    "    \n",
    "    sortedDistIndicies = distances.argsort()  # 从小到大排序返回其下标\n",
    "    classCount = {}  # 统计每个标签出现的次数\n",
    "    for i in range(k):\n",
    "        voteIlabel = labels[sortedDistIndicies[i]]  # 依次获取前k小的标签\n",
    "        classCount[str(voteIlabel)] = classCount.get(voteIlabel, 0) + 1  # 标签不存在数值返回0\n",
    "        \n",
    "    sortedClassCount = sorted(classCount, key=operator.itemgetter(0), reverse=True)  # 按第一个域降序排列\n",
    "    return sortedClassCount[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'B'"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "classify0([0,0], group, labels, 3)"
   ]
  },
  {
   "attachments": {
    "%E5%9B%BE%E7%89%87.png": {
     "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAFoCAYAAAA2I65oAAAgAElEQVR4nOzdeXxM9/4/8JlDEknsCUJrLS6K2+p1LUESZLGW2rlKUYpaqpbINokYJMRae6toKa0tLYJEQhJZaLW22pcIsUYIWWYymdfvD78538xkEokss/T1fDw+jwc5Z855nzkz53XO55wzRwIiIiITJDF0AURERG+DAUZERCaJAUZERCaJAUZERCaJAUZERCaJAUZERCaJAUZERCaJAUZERCaJAUZERCaJAUZERCaJAUZERCaJAUZERCaJAUZERCapzAMsPj4eJ0+exK1bt5Cbm5tveFJSEqKjo3Hy5Encvn27rMshIiIzUaYBdvfuXUydOhXdu3eHt7c3srKy8o0THR2NgIAAjB07FmPHjsXNmzfLsiQiIjITZR5gO3fuhIeHBxo3boy0tLR84yQlJeHEiRPYtm0bLCwssHnzZr1HakRERHmVyzmw4OBgWFtbIzU1tdDxrKys4OPjwwAjIoN69eoVjh8/XqKWmJiIx48fF2u+t27deuN079+/X+rLe+/ePURHR5doeVUqVanX9SZGE2DfffcdmjVrhqioKKjVagCvV2ZEREShjV2OxiEpKQlRUVFQKBR6h0dFRYnrzNx2ULKysnDp0qU3flYLaleuXHnjPJ49e4YzZ8689TwKakuWLMH8+fO12v79+0t9Ppq2adMmhIeHl+o0jx07lm8ZStqmT5+OLl26iK13796QyWTFan5+fvDy8irWfEeOHKk137xtwIAB+Oqrr+Dt7V3qyztmzBi4uLgUOO8uXbpg/vz56N69O7y8vPQu7/z583H06NFy/X4bRYBt3rwZ3bt3x48//qi18Fu2bEGXLl0wevToAj8kXl5emDt3rlY7duxYsdrhw4fh5eWFY8eOISwsDN98802+aRpDW79+vd76jaHeUaNGoWvXrpg5c6be4d26dYOjoyMcHR0xe/bsN05vw4YNxV6PBbWwsLAyXfYZM2Zg4MCB4vL17NkTkyZNKvKGztvb+43zmDhxIjw8PMR5fPbZZ2+c7hdffIHRo0djzpw5BY7zySefoGfPnujZsyfGjh2LwMBABAQEFHtjXdQ2btw4cRkcHR3h5+dX5NeOHj1a77bAz89PXAZN8/DwQFBQUKm1devWITY2tljt2LFj+PbbbwucZt++feHk5FTkGjZv3owjR45g27ZtpbpsRW2RkZFYsWIFoqKi9C5vy5Yt4ePjg5ycnPKIFQDlFGBTpkyBlZUV/vjjD+Tm5iIiIgLXrl1Dbm4uNm3ahMaNG6Nbt244dOgQrl+/Lh6BBQQEQCqVYteuXYiLi9Pbdu/ejWXLlmm14n6pvL29xT0sHx8fjB07Fm5ubgW2Pn36YMaMGfnm+6b22WefoU2bNsV+naYtWrRIb/1jxowptF43NzfMmTMHo0ePxty5c996/rrt448/hpubG+RyebFeN2XKFCxduhTLli2Dh4cH3NzcMHny5CIt69s0Hx8f8X3w8PDAl19+ma+moKAgjB49GlWqVMH06dNL9L6sXbsWoaGhBX5mddvevXuLPY+9e/e+cbqDBg1C37598dNPPxWpjhs3bkCpVOKvv/4qcu1v00JCQsTlOHXqVJFfN27cOIwfP75I4yYmJpbHpq1EQkJCMGfOHEOXUWrc3d3h6+trXgHm6+uL9957D4IgYOXKlVAoFJgwYQI2bNgApVIJd3d3CIKAd955Bx06dEBERES+ACvuIWl8fHyZtjNnzuDhw4fFfi9CQ0MxcODAYr9O4969e29d89OnT3H16tU3nocsjhUrVkAmk+HFixfFXg7NOk5ISEB8fDzu3r2rNU5ycnKZrLuEhAS95xBUKhUSExPxzjvvICUl5e3fFCMSGBiIadOmFamL0hTIZDL4+/sbuoxSwwAruTIPsM2bN2PVqlVYtWoVYmNjoVKpEBoaivj4eKhUKhw4cACrV68Wx8m7IXvbADNWERERmDJliqHLKDVvG2DG6u7du2jYsKGhyyg1u3fvxoYNG5CcnGzoUkpFQkICEhISDF1GqYmMjMSBAwcMXUapmTJlCvz8/MwrwErC3ALswYMHZvUF/Ouvv3D69OkCL9wwNWlpaQgICDB0GaXm+vXruHHjht77L8nwXr58iefPnxu6jFIjl8sxatSoct0eMMCI/j+VSvVWXcNE9DrAGjRoUK47TAwwIiIqMblcDgsLC2RmZpbbPI06wHbt2sUAIyIyAQwwHSdOnGCAERGZAAaYjg0bNjDAiIhMAANMB8+BERGZBgaYjkuXLkEQBOzevdvQpRARvdG9e/fw888/Iz4+3tCllDsGmI5Lly6hdevWuHjxoqFLISJ6o/DwcLRq1QoTJkwwmxvIi4oBpmPt2rWYOnWq+LNDRETGKj09HatWrYJEIkG7du1w9OhRQ5dUrhhgOgICAjBo0CAGGBEZtfv370Mul2Ps2LFYtGgRPDw8sGfPHkOXVa5GjhyJNm3a8EZmjYCAADg7OzPAiMioXb16FcOHD8fAgQPx559/YvDgwZg1a5ahyypX9evXx+TJk6FUKsttnkYfYNOmTWOAEZFRi4yMRN26dVGnTh106dIFDg4O6Ny5M06dOmXo0sqNra0tvLy8+GO+GpoH6zHAiMhY3b9/H7NmzUKnTp1w9OhRHD16FMHBwejTpw/27duXb/zY2FjxmYNyudxsHt/DANPBACMiY3f9+nVMmjQJ06dPF/9269YtzJo1K1834tWrVzF+/HhYW1tDIpGgTp06WL16dXmXXCYYYDoYYERk7DIzM3Ht2jXcunVL/JtSqcTZs2dx5MgRrXHPnDmDXr16QSKRiM3T07O8Sy4TDDAdAQEBaNSoEX+Jg4hMjlKpREZGhtbfbt++jc8//5wBVkqMPsD4U1JEZC4UCgUSExMxaNAgtG7dGp6enoiLizN0WaWCAaaDAUZE5kahUODWrVu4cOECHj16ZDZPzGaA6WCAERGZBgaYDgYYEZFpYIDpYIAREZkGBpgOBhgRkWlggOlggBERmYYuXbrAx8eHAabBACMiMg3u7u7w9fVlgGkwwIiITAMDTAcDjIjINPj4+EAmkzHANBhgRESmQS6XM8DyYoARkSk5ffo03NzcMG3aNEOXUu4YYDoYYERkKp49e4alS5fCwsICw4YNM3Q55Y4BpoMBRkSm4siRI2jcuDE6duyIIUOG4NChQ4YuqVwxwHQwwIjIVISGhqJjx474/vvvMXjwYIwfP97QJZWr/v37m99ViOvXr8fJkycLXaiVK1di2bJlUKlUWn9ngBGRKbh58yY+++wzdOnSBT///DMGDx6MkSNHGrqscmV2l9GvX78ederUQY0aNZCamqp3nOHDh8PV1RWurq4YOHCg1sIzwIjIFISFhaFSpUpo1aoVAgMDMXjwYHz44Yc4fPiw3vH/+OMPLF26FEuXLsXJkyfLudqyIZPJzKsLMSMjA48fP4adnR2ePn2ab/iKFStga2uLlJQUHD58GDY2Nli8eLEYWAwwIjJ2aWlpCA4ORvv27REbG4tXr17hxo0bmDNnDvr3749r165pjX/o0CG0a9cOtra2sLW1hbu7O2JiYgxUfemRy+Vwd3dHdnZ2uc2zXM6B1apVCzKZLN+D2+RyOSwsLJCZmQmlUgkrKyv4+PgwwIjIZKSmpmL37t3YsmWLeBokNzcX27dvh6urKy5fviyO++eff2LgwIGoUKECJBIJJBIJunTpguPHjxuq/BJJSEhAbGwsVCoV5HI5bGxskJmZWW7zL7cAmzt3br4FyxtgAAoMsMWLFwMAYmNjy6NcIqIiU6vVUCgU+Y48srOz8eLFC61z+8nJyZg6daoYXqYeYDExMYiKioJKpYK9vT0kEol5BtjevXvz9Y2+KcAiIiIglUrh5+eHmJgYBAYGlke5RERlIjc3F6tWrdIKsOHDh+PGjRuGLu2t5OTkiNv1Hj16YM6cOeZzDkyjVq1aCA0NFRcsJCQECoUCkZGRsLKyQkREBJYsWYIKFSogPT1dfN2JEycglUqRmZmJnJyccu1bJSIqC7dv38bGjRvh6emJNWvW4NKlS2ZxmiQgIACVK1c2nyOwhIQENGjQAFKpFDY2NnBzc0N4eDgCAwOhUCigUqlw5MgR1KhRAy4uLvj111+hVqvF12sCzBxWLhER8LrLUalUIjs7G0ql0my2b7o9auWhTANMpVLh1atXePnyJV6+fInMzEyoVCooFAqtcfIO0329IAhms4KJiMyV2QVYaRAEgee+iIiMHANMx6JFiyCVSnnui4jIyDHAdOTk5EAQBCxYsMDQpRARUSEYYHoIggA/Pz9Dl0FERIVggOkhCILJ3uRHRPRPwQDTQxAEREZGGroMIiIqBANMDwYYEZHxY4DpIQhCvvvDiIjIuDDA9OCNzERExo8BpocgCJDJZIYug4iICsEA04OX0RMRGT8GmB4MMCIi48cA04MBRkRk/BhgejDAiIiMHwNMDwYYEZHxY4DpwQAjIjINNjY2DLC8GGBERKaBAaaDAUZEZPyio6NhZWXFANM4ceIEpFIpfwuRiMjIMcB0BAQEQCqV8qekiIhMALsQ82CAERGZDgZYHgwwIiLTwQDLgwFGRGQ6GGB5MMCIiEyDWq2Gra0tA0yDAUZEZBrkcjlkMhlycnLKbZ4MMCIiKrGFCxcywPLy8/NDxYoVGWBEREbO3d0dvr6+DDCNChUqwM/PD2q12tClEBFRIXr16sUAy4sBRkRkGgIDAxEQEMAA07CwsICPjw8DjIjIyLm6uiIiIqJcT/kYdYC5uLjAycmJAUZEZORsbW3x/Pnzcp2nUQdYt27d0L17dwYYEZGRs7W1hZeXl/l0IapUKigUCigUijcO1zcOz4EREZkGswowlUqF8PBwBAQEwNvbG0+ePMkXROHh4fDz88OiRYvg4+ODFy9eaA23sbFhgBERmQCzCrDo6GjY2dmhZ8+e6NOnD7p06YLHjx9rjePh4QEnJydkZ2fD1dUVjo6OWgsfEBAAmUzGACMiMnJmFWAhISGoXLkyHj58CACws7PD3LlzkZWVJY7Tt29fODo64smTJ3B2doatra1WV2JAQADmzp0LtVqNnJyccn1jiIiocFlZWVAqlUhPT4eNjc0/K8D8/f1hY2ODvn37wsrKCrNmzYJKpRKH5/0pqWPHjiEqKqqsyiUiomJauXIlTp48icGDB6NixYr/rADr0aMHevbsiezsbPTu3RuCIGgdgfn4+MDS0hK5ubkIDg5GbGxsWZVLREQlYFZdiOvXr0fNmjVx9epVPHv2DDVr1oS3tzdSU1Px6tUrqNVq1KlTBzNmzMDz58/h6emJChUqaAUY7wMjIjINZhVgADB+/Hi4ubnB1dUVderUwdGjRxEUFAS5XA6FQoFVq1ahTp068PHxQfXq1VGzZk2tAHN3d2eAERGZALMLMOD1kVhISAhOnjyJnJwcJCYmIi4uTjzXlZCQgOXLlyMkJASxsbFaYRUQEABnZ2cGGBGRkTPLACuJgIAAdOrUiQFGRGTkGGA6+EBLIiLTwADTERAQgBo1ajDAiIiMHANMR0BAAKZPn84uRCIiI8cA08EuRCIi08AA08EAIyIyDQwwHQwwIiLT0LBhQ3h7ezPANBhgRESmQS6XQyaTMcA0GGBERKaBAaaDAUZEZBrmz5/PAMuLAUZEZBrc3d3h6+vLANNggBERmYbBgwczwPJigBERmQaeA9PBACMiMg2TJ0+Gn58fA0yDAUZEZBpatGjB+8DyYoAREZkGdiHqYIAREZkGBpgOBhgRkWlggOlggBERmQYGmA4GGBGRaWCA6WCAERGZBgaYDgYYEZFpYIDpYIAREZkGBpgOBhgRkWlggOlggBERmQa5XI4pU6ZAqVSW2zwZYEREVGJyuRytW7dGVlZWuc3TqANsw4YNDDAiIhMgl8thYWGBzMzMcpunUQfYlStXGGBERCaAAaaHIAg4c+aMocsgIqJCMMD0EAQBoaGhhi6DiIgKwQDTQxAEJCQkGLoMIiIqBANMD0EQcPDgQUOXQUREhTDLAPv111/xyy+/4Pbt2wVejLFv3z6sXLkScXFxUKvVWsMEQeBFHERERs7sAiw0NBQeHh4YOXIkvvjiC0RFReW7S3vPnj3o0aMHOnXqhI0bN+YLKwYYEZHxM7sA69ixI4YNG4Zff/0VPXv2RM+ePfHy5UtxeHx8PFq2bImRI0di06ZNiIyM5BEYEZEJSUhIwJ07d7Bw4ULzCrC6deti9uzZyMjIwI4dO2Bra4u0tDRxuCaxXVxcMGHCBHz++ee4ffu21jQEQcDt27eRlJSEpKSksiyXiIiKadGiRQgMDISbmxsqVKhgngF2584dVKtWTW+AOTo6Yv78+XBycsKWLVu0jsIEQcD48eOxdetWbN26tSzLJSKiYjpx4gS+++47uLi4QBAE8wywU6dOoWrVqnoD7MiRI8jNzcWECRMgk8m0ugwFQUC3bt0QGRmJyMjIsiyXiIjektmdAxs0aBCcnZ1x6NAhTJo0CU2bNsWLFy8QExODW7du4eTJk2jevDk2b96MyMhING3aFL6+vvkCzM/PryzLJCKiEjK7AIuPj0e/fv3g5eWFcePGwc/PD1lZWVi0aBEiIiKgUqmwY8cOcVj37t3zXcjBACMiMn5mF2DA6ytUoqOjER0dLd4LdurUKdy+fVsMqtjYWHEcfVchMsCIiIybWQZYSTHAiIiMHwNMDwYYEZHx27lzJywtLRlgeTHAiIiMX3R0NKysrBhgGtevX4dUKsUPP/xg6FKIiKgQDDAdmzdvhlQqRXJysqFLISKiQqSkpMDa2poBphEQEACpVMrfQiQiMgE2NjYMMA0GGBGRaTh06BAGDhwIhUJRbvNkgBERUYnJ5XLIZLJ8j8wqSwwwIiIqsY4dO8LHx4cBpsEAIyIyDba2tvDy8mKAaTDAiIhMQ7t27XgElhcDjIjINMycORN+fn4MMA0GGBGRaZDL5Rg6dCivQtRggBERmQa5XA4HBwdkZWWV2zwZYEREVGL8NXodDDAiItMgl8sxatQoKJXKcpsnA4yIiEpMLpejRYsW7ELUYIAREZkGdiHqYIAREZkGuVyOdu3a8QhM48CBAwwwIiITIJfL0b17d2RnZ5fbPI06wJ4/fw5BEBhgRERGTi6Xw97enl2IeTHAiIiMH8+B6cEAIyIyfgwwPQRBwMaNGw1dBhERFYIBpocgCEhOTjZ0GUREVAgGmB7sQiQiMn4MMD0YYERExo8BpgcDjIjI+DHA9BAEAQkJCYYug4iICsEA00MQBERGRhq6DCIiKgQDTA8GGBGR8WOA6SEIAhYvXmzoMoiIqBBmGWCbNm3CypUrC/2F4sTERKxevRoqlSrfMEEQ4OfnV5YlEhFRCZldgH3xxRfo1asX3N3dMXToULx69UrveI0aNUL16tWhUCjyDWOAEREZP7MKsE2bNsHe3h4XL17Eo0eP4ODgALlcnu+n9hMTE2FlZQWJRIKTJ09CrVZrDWeAEREZP7MKsJCQEFSuXBkPHz4EALi7u6N69ep4/vy51ngNGjTAjh07YGFhgcDAwHzdiAywf7bly5cbugQiKsDp06fRrFkzvHr1Cv3794cgCOYZYP369UPFihWRlpYmjjNq1Ch07twZ6enpqFSpEnx8fPQGmKurK9RqNUJCQhAXF1dWJZORiYuLg7u7O9c5kZFSKBRISUmBWq2Gu7u7+QaYg4MD/vvf/+Lly5fiODVr1oSlpSXq1KkDqVSKypUr5zsPJggCnJycoFar8fLlS73nycg8KRQKpKamcp0TmYDDhw/DysrKPAIsIyMDDg4O8PDwgFwuh42NDXbt2gWlUomVK1dCqVTi8ePHePToER49egQrKyt07NgROTk5WtMRBAHz588vqzLJBAwYMADBwcGGLoOICqFUKmFjY2MeAQYAqamp6N+/P6pWrYoff/wRGRkZWLlyJTw8PJCRkaE1bqVKlXDgwAFexEH5PH/+PN/nhYiMj1kFGACkp6fj6dOnYjdQZmYmXrx4kS+oUlNToVQqtf526tQpSKVSHD16tKzLJCKiEjK7ACsJuVwOqVTKcyBERCaAAZZHQEAApFIpH6dCRGTkli1bZj73gZUGBhgRkWkwqxuZSwMDjIjINERFRZnPZfSlgQFGRGQaVCoVz4HlxQAjIjINwcHB8PLyyncvb1ligBERUYnJ5XLIZDIGmAYDjIjINDDAdDDAiIhMAwNMBwOMiMg0yOVyVKpUiRdxaDDAiIhMA+8D08EAIyIyDQwwHVFRUQwwIiITwADTceLECQYYEZEJYIDp0ARYZGSkoUshIqJCMMD04AMtiYiMHwNMDwYYEZHxY4DpwQAjIjJ+DDA9GGBERMaPAaaHIAi8CpGIyMgxwPRggBERGT8GmB6CIPAyeiIiI8cA0xEQEABnZ2eo1WpDl0JERIVggOlggBERmQYGmA7+mC8RkWlwd3eHk5MTsrOzy22eDDAiIioxW1tbeHl58YGWGgwwIiLTwADTwQAjIjINlStXZoDlxQAjIjINHh4e8PX1ZYBpMMCIiEyDXC6HTCZjgGkwwIiITINZBphKpYJKpdIbQrm5uYUOZ4AREZkGswswpVKJoKAg+Pr64uDBg1AoFFrDo6Oj4efnB29vb4SFheUbzgAjIjINAQEB5hVgAwYMgIuLC1xdXWFhYYEDBw5oLVxsbCyqV68Oa2trWFhYwNPTEyqVShzOACMiMg3VqlXD3LlzzSPAcnNzUbduXcyePRsZGRlwcHDAV199haysLL3j+/v7o0KFClpHYQwwIiLjpVQqoVQqAQALFiyAjY2NefyUVExMDOzs7DB//nxkZGQgKCgI1tbWSEtLyzeuQqFA9+7dYWtrqzfANG8QEREZj5CQEMjlcigUCvTs2dN8LqNfs2YNqlSpgocPHwJAgQGmUqng5+cHGxsbHD9+XOuHezUBFh4eDpVKle8cGRERGYeqVati3rx55hFgAFC3bl0kJSUhJycHCxYsgJ2dHZ4/fy7+2GNOTg7CwsJgY2ODBQsWaJ3/Av4vwORyOWJiYrB48eKyLJeIiN5Snz59zOvHfJs2bYrp06dj3759cHBwQFhYGHJyciCTyaBQKBAdHQ0rKyt06tQJjx49QlpamlZ68xwYEZFpkMvlcHNzM58AS0xMRJMmTVCzZk0cPnxYDKeGDRvi5cuXiIuLg4ODA2rWrCm2EydOiN2IDDAiItNgdveBlRQDjIjINMjlcvO5jL40MMCIiEwDn8isQxNg6enphi6FiIgKwQDToQmw4OBgQ5dCRESFYIDpWL58ObsQiYhMAANMD0EQGGBEREaOAaYjKyuLAUZEZAIYYDpOnDjBLkQiIhPAANORmJjIACMiMgEMMD0EQcCTJ08MXYZeKpUKqampePbsWbn+fAoRkbFhgOkhCAJWrVpl6DLyUalUuHTpEmbMmIFFixZh3759uH37NoOMiP6RGGB6CIKAR48eGbqMfO7fv49Ro0ahTZs28PHxgYODA1q0aIG4uDhDl0ZEVO4YYDoePXoEQRDwzTffGLqUfC5cuIBatWohJCQEjx49wvr169GgQQPs2LHD0KUREZU7BpiODRs2GO1FHJcuXULNmjXRr18/hIaGQi6Xo1WrVjh79qyhSyMiKncMMD0EQcCLFy8MXUY+d+7cQbdu3VC/fn0sW7YMAwcORNu2bREeHq53/JycHKSlpeHBgwf5nkpNRGTqGGB6CIKAyMhIQ5eRz6NHj/DFF1/gww8/BABcvnwZXbp0wWeffZZv3JycHFy5cgXBwcGYOHEili1bhpSUlPIumYiozDDA9DD2AGvZsiUuX76MQ4cO4YMPPsCIESP0juvn5weJRAKJRIIaNWpg+vTpePbsmQEqJyIqfQwwPQRBwIEDBwxdRj7Pnj1DUFAQXFxcMHnyZIwZMwYjRozA1atX8417/fp1jBw5UgwwiUSC//znP0YZzEREb4MBpocgCPDz8zN0GSWSnJyMr7/+GjY2NpBIJLCxscHkyZMNXRYRUanZtm0bLC0tGWB5mUOAAcDFixcxYMAAVKtWDd26dePRFxGZlbt378La2poBlpe5BBjw+t6x6dOnY8uWLYYuhYioVLELUQ9zCjAiInO1du1adiHqYoARERm/8+fPo1KlSgywvBhgRESmwcbGhgGWFwPMdNy8eRMqlcrQZRCRgTDAdDDATMe+ffuQlZVl6DKIyEAYYDoYYERExu/q1as8B6aLAUZEZPx4Gb0eDDAiIuO3ceNGXkaviwFGRGT8Ll++zC5EXcYaYDk5Obhx4wb27t2L8+fP4++//0ZqaqqhyyIiMhgbGxvcuXMHarW6XObHAHtLz58/R3BwMOrXr4/169dj1apVWLZsGa5fv27o0oiIDMLGxgZHjhxBbm5uucyPAfaWNM8Da9WqFS5fvoyff/4ZNWrUgKenp6FLIyIyCLMLsPDwcHz33XdITExETk6O3nHCwsLw7bff4vfff8936GnsAfavf/0LCQkJWL58OWxtbfU+kZmI6J/AxsYGW7duNY8Ae/jwITp06IB27dph3Lhx2Lt3L5RKpdY4hw8fRo8ePfDRRx+hb9++SExM1AoxYw8wBwcH+Pj4YOTIkahduzaCgoIMXRoRkUHY2NjA29u73H6Rp0wDbN++fahWrRp27NiBVatWoU2bNrh69apWQLVt2xbDhw9HaGgoOnbsiN69e2stvLEHWJMmTRAeHo6wsDB8+OGHGDZsmN7xs7KycOnSJRw4cABHjx7FjRs3yrliIqLSd+jQISQmJuLMmTOoVKkS9u7dax5HYKNGjUKHDh2QlpYGAKhZsyY2bdqkdRSmSeycnBwEBgaiQoUKWsMFQcD48eORmJiIxMTEsiy3WDQB1rx5cyQmJuLgwYPo378/HB0d9Y5/8eJFDB8+HE2bNsWHH34IX19fXrVIRCZv3bp18Pf3h0wmg4WFBaKjo83jKsQ+ffrAzc0Nz1uc8EgAACAASURBVJ8/B/A6wObNm4fs7GxxnLwBdvToUVSsWDFfgDk5OUEmk0EmkyE5ObksSy6yly9fYuvWrXB1dYVMJoOnpydGjBgBb2/vfOOmpaUhJCQEEolEbB06dEBMTIwBKiciKl3Hjh1DWFgYrKyszKcLcdmyZbC1tcXjx49x//59VK9eHatXry7wCGzPnj1o2LCh1vDOnTvjf//7H44cOYIjR44YVddbenq6WNeRI0dw4sQJ3Lt3L994169fx8iRI7UC7P3338eePXsMUDURUdkwq3NgO3fuRNWqVXHo0CEEBwfD2toaZ8+exS+//IKYmBioVCp8+umncHNzw8mTJ9G8eXN4enpqLbybmxtkMllZllnmnjx5gmXLlsHe3h4SiQQ2Njb45JNPcP78eUOXRkRUaswqwO7cuYPPP/8cbm5uGDVqFEaOHImMjAxMnDhRPBd2+/ZtfPrpp/Dz88PIkSNx7do1k7gKsbiSkpKwYsUKeHp6IjAwEBEREYYuiYioVJlVgAGvN9yBgYFi919ubi5OnDgh/hsAbt++jcjISNy8eVMrvJKSkiAIAsLDw8u6TCIiKiGzC7CSOHHiBKRSabldkklERG+PAZaHJsBu3bpl6FKIiKgQ0dHRqFSpEo4ePWoel9GX1J07dyAIAiIjIw1dChERFYIPtNRDEATcvn3b0GUQEVEhGGB6CILAc2BEREaOAaaHIAg4cuSIocsgIqJCMMB0HD16FFKpFKdOnTJ0KUREVAgGmI7ExEQIgoBDhw4ZuhQiIioEA0wPc/klDiIic8YA00MQBPz444+GLoOIiArBANOD94ERERm/P//8E5UqVWKA5SUIAtavX2/oMoiIqBAHDx6ElZUVAywvngMjIjJ+7ELUgwFGRGT89uzZA0tLSwZYXgwwIiLj9/jxY1hbWzPA8mKAERGZBhsbGwZYXgwwIiLj9/fff/MqRF0MMCIi47dhwwaeA9PFACMiMn68ClEPBhgRkfG7fv06rK2tsXXr1nJ7BBYDjIiISmzXrl2wtLTEhQsXoFary2WeRh1g586dg1Qqxd69ew1dChERFeLWrVu8jD6v1atXQyqV4unTp4YuhYiI3oCX0ecREBAAqVRabv2pRET09hhgeTDAiIhMh42NDeLj43kRB8AAIyIyJTY2Njhy5AgDDGCAERGZEhsbGzx8+LDc5scAIyKiEvv+++8xceJEKJXKcpsnA4yIiEpMLpejQYMGyMrKKrd5MsCIiKjE+FNSOhhgRESmgQGmgwFGRObq4cOHuHv3rqHLKDVmGWBbtmzB2rVrERcXB5VKlW/477//jnXr1mHt2rVYu3atVlgxwIjIXJ05cwYnTpwwdBmlxuwCbMuWLRgwYAC8vb3RrFkzLF26FNnZ2VrjLF++HH369IGvry9q166NlStXioHFADNuf/31FxITE6FQKAxdCulx+PBhrFmzBrdu3TJ0KaVizZo1+OabbwxdRqlZt24d/P39DV1GqTG7AGvVqhWmTZuG5ORk9OjRA+7u7nj16pXWOKmpqUhOTsbTp0/RuXNneHh4ICcnB4D5BditW7fwww8/4Nq1a4YupVSsX78eQUFBSE9PN3QppSIlJQUfffQRtm7dauhSSsXu3bshk8lw5coVQ5dSKmQymVlt8CMjI3HgwAFDl1FsmzdvxurVq8Wm6V0zqwA7e/Ys7O3tMXv2bGRkZCAgIAA1atTA8+fPC3xNz5494eTkJAZYWFiYWQXYlStXsGDBAuzfv9/QpZSKFStWQCaT4cWLF4YupVTcvXsX1apVw8qVKw1dSqn4JwWYSqXCqlWrStQWLFiApk2blqi5ubnpnfakSZPyjfvuu++iXr16b5zmZ599VqT63d3dS1y/pi1YsKDA+fj7+0Mmk4lt8ODBaN68Oezs7CCVSk0nwLZv34527dqhSZMmWu2TTz7BoUOHYGdnJwZYUFAQrK2tkZaWpndan376KZydnXH37l3xWTJZWVkQBAHDhw/HypUr8zVTc+XKFchkMuzevdvQpZSKEydOYMiQIXjy5ImhSykVd+/eRe3atUvtvERaWhoOHz6s97OraZGRkW89/aioqEKnPWbMGDRp0gSTJ08udLwHDx7gp59+KnSc4rQWLVrk2yY0adIEw4cPx4oVKwp97YgRI/S+tkmTJqhRowZq1Kihd1izZs20NqrFacuXL8ezZ8/w9OlT3Lx5s0Tt7t27ePbsWb724MGDt56mZkdEt23fvh1hYWEICwvDjRs3kJycXOL6Ne3p06d6l0NfS0lJwa1bt7Br1y7s3LlT77UOZaVEAZaeno5ff/0VP/30Ey5fvozbt2/j9u3bSElJQUZGBhwcHIoUYKNHj4aNjQ1++eWXfA9CmzlzJubNm6d3BTZq1AiNGjXCihUrjKotWLAAvXr1EuvTtHfeeQfVq1dHrVq18g0rrHXq1AmzZs0q9TqdnJyKVYduq1u3LmxsbFC/fv1CxwsKCjL4OnlTW7hwId59911UqFABdevWLdH7omkNGjRArVq10L59+wI3nsOHD3/r6depUwcffPABJk+erHfaXl5emDVrFry8vArdgLdv3x5ffvnlWweAbrt27Zq4LcjbQkND8+29521hYWF48OCB3te+qd25cwdpaWlv1Yy9ByEzM1Nv3a9evUJWVhaysrLKNTQAYMOGDfmuZ9DUUp5K3IWoUCiQnZ2t9wmcffr0gaurK5YsWQIHBwdMnjwZmZmZ+OabbxAbGwuVSoXExERUrVoVEolE7wfp+fPnBbakpCQkJSWV2hevtJqvry/mzp2LmTNnYubMmfD398fRo0fFeovbTp8+jY0bN5Z6nbNnz0ZMTMxb11XUtnDhwmLV5e7ujmrVqomtPNbZwoULsX///jJZ/pSUlAI/w48fPy7RtO/fv4/U1NRCvydvavfu3SvxNPK2gp7Gm52dXejrdDeI5uLSpUvw9PTEl19+iePHj+cbfv/+faxatQqdO3dG586dsWfPHgNUWXTjx4+Hvb096tevr/f8d0JCAlauXInGjRujQYMGGDJkSJkFbJlexPH06VP0798fNWvWxJQpU/Dw4UOo1WoMHDgQgYGBUCgUWLp0KSpWrAiJRIJ33nkHwcHByM3NxYoVKxASEoK4uDi9016+fLn47xcvXhh1e/nyZYl+H0ylUiEjI6NMatOcbyxL6enpxarp8ePHSE5OFlt5rKP09HSTvZryxo0b+OGHHxASEoK///5b7zj79+9HSEgIQkJCcOTIEaM+6li+fDneffddvPvuu3q//7GxseLwhg0bIiEhwQBVFt2ff/6JgQMHokOHDjh48GC+4Xv27IGbmxuGDx+Orl27om3btti3b58BKi2ap0+f4t69e6hWrRrkcnm+7012djYCAwORlJSEX375BdbW1li6dGmBOzYlUeb3gaWmpiIlJQUvXrwQFyA1NRXp6elQq9V4+fIlUlJScP/+fdy/fx/p6elYvnw5qlWrhipVqsDOzg6nTp3KN113d3fUq1cP9erVQ0hISFkvRrHcu3cPM2bMQMeOHbF58+Z8G5WnT59i2bJlqFevHv79739j9erVBqq0aP766y9MnDgR7733Hnr37o2UlBSt4b///jvef/99cX3079/faK9MzMnJwfHjx9G/f380aNAA48aNK3DcW7duoV69enB2di7HCovvq6++Er8vnTp1QkxMjNbw/fv3o127dhgzZox4tJmUlGSgagsXFxeHqlWrYtasWejUqRPs7Oy0Qiw3Nxf29vZwdHREcnIyZs6ciXr16hmw4jdTKpU4efIk5s2bpzfAgoOD0bVrVxw8eBC//vorHB0dsWTJEgNUWjw1atSAp6en3iNnzfdfoVCgYsWK8PX1Nc0AK674+HhUr14dX331FVJSUuDo6Ig+ffrkW/jU1FTs3bsXDx48QOXKlfHJJ58YqGJt9+/fx7Rp09C8eXNMmjQJHTp0wJAhQ7TGiY2NhaurK/r164e+ffuiQ4cOCAsLM1DFb/bll1/CxcUFU6dORe3ateHm5oYHDx6Iw+Pi4rB//37cvXsXv/32G+zt7REWFlYuR3fF9erVK/Tu3Rs9evTA1KlTUaVKFb0hlpWVhV27dkEikaBVq1YGqLRoNmzYgEaNGmH58uWIiYlB9+7dERgYiKdPn4rjDB06FBUqVMC+ffvw8uVLvHz5stzPmRTVokWLIJFIkJ6ejtTUVEgkEixatEgcrlar0alTJzg7OyM4OBiurq7o1q2bASsumrNnz0Imk+kNsMWLF6Nr166IjIxEVFQUunXrBrlcboAqi6ewANOIi4tDhQoVcPjw4X9GgC1evBiCIIiX23t7e8PS0lLvwmu65SQSCSwtLcu1zoLEx8ejadOm+Oabb5CcnIyFCxeiY8eO4lHYtWvXxCsuT58+jbi4OPTr1w+TJ082cOXAzp07ce/evXx/b9euHT7//HMkJSVhyZIlqFWrFm7evCkOVyqVUCqVUKvVOHXqFKpXr47Q0FCjDLC0tDRUrVoVgYGBePz4MaZOnYoGDRpojZOdnY09e/agdu3a+OCDD4w6wKZOnYpevXrh9OnTUKlUGDlyJIYNG6Z11N+/f39IJBKMHz8e7du3h4uLCy5cuGDAqgvm7+8PiUQift8lEonWpfNqtRrz58+HpaUlbG1tYWlpiZ49exqq3CL7JwZYXFwc7O3tsWfPnjI7v2mQAEtISED9+vVhb2+v1fr27Qs/Pz8IgiBu/Pz9/SGVSgtM79jYWEgkEjg6OpbnIhQoNjYWDRo0wPfffw+1Wo3Dhw/jv//9L86fPw8AuHz5MoYMGYLBgwdDpVLh3LlzGDBgQKFdWeUlKytL7z13bdu2xeTJk/HkyROsWbMGNWvWxI0bN/ROY8SIEXB0dNQ6AjAmaWlpsLa2RlBQEDIyMjB79mzUrVtXa5w7d+6gWbNm2LVrF7744gujDrAvvvgC/fr1w9mzZwEA//vf/zBo0CBcvHhRHKd///4YNGgQzp07hw0bNqBJkyZG+xNGbwqw3Nxc2NraYt68eXj8+DH27NmDSpUqGd1pBF3/hABbsWKFeFARFxcHOzs77N27t0zPLRskwHJycnDw4EGEhobi8ePHePr0KZ4+fYoXL14gIiICFStWLFKAxcbGomrVqpBKpTh8+HB5L4ZeeQMMAI4dO6Y3wIYOHQoARhVgBSlqgOm7l8/YvCnAXrx4gXnz5qFmzZrw9vZGp06d0KhRIzEgjE1wcDAmTJjwxgAbOXIkrl+/ju3bt6Nx48aIiooyUMWFK0qASaVSBAQEQK1WIzw8HFZWVuV682xxPXr0CD4+PrC2tka3bt1w7NgxbNiwAR4eHoiKisK1a9cwduxYeHh4oFevXhgzZoxR/1rPqFGj4ODgAKlUCmtrayxYsABBQUGoVq0aMjIyAAC1atVC586dERgYiCVLliAoKMi8uhBzcnL0djHl5OTAwsICffr0weLFi2FtbY3Q0FAAQL9+/cSTm0uWLEGVKlXg6OiIX3/91Wi6q/IGWFpaGlasWKEVYCqVCjt27ICLiwuuXLmCiIgIODs7a/XzG5uiBNinn34KW1tb3Lx502jDC3hzgD1//hxz585Fz549MX36dFSsWBENGzbE6dOnDVh1wQ4cOID27dtj2LBhGDduHFxcXHDo0CEsWrQIs2fPxrVr17B161a0bNkSEyZMwJAhQ9C1a1ejDeSsrCx06dIFffv2Rd++feHo6IjMzEz07dsXdnZ2AIDQ0FBYW1ujRo0aqF69Og4dOmTgqgt37tw5+Pn5Yd68efDy8sKhQ4cQGxuLtWvX4tq1a8jNzUVERAS8vb2xceNGXLlyxah/fejly5daNzJnZmYiKysLvr6+4hGYt7c3vL29xdtUNMFW2ozuHBgAHDx4EFZWVqhUqRIcHR3FN8XZ2RkymQzA/+2peXt7G014Aa8vLgkODkaLFi0wadIkdOrUCfHx8Th8+DDat2+PvXv3IioqCu+//z6qVKmCypUrY/To0UZ9D8zJkyfRvHlzfP3113jnnXewadMmvHr1Cm3btsX8+fORnp6OBg0aiOujbt26OHz4sFGtFw2lUomffvoJNWrUgK+vL+rUqYNjx44hJSUF9evXx9q1a5GVlYVXr17h/v37+Pzzz9GyZUujvehBqVRCLpfjnXfegYWFBebOnYuUlBT4+/tjypQpuHz5MhQKBeLj47F8+XL4+Pjg4sWLRrs8wOufkNNsAF++fAng9QZR0/2Wk5OD1NRUeHl5IS0tzSg/Z3mpVCrxJt+srCwolUqoVCooFAoxqHJycpCVlaX1N1OT9ybmvMtbljc3G2WAqVQq8f6cvMmdkZEhbuizs7Mxf/58yGQyVK1aFb179zZUuVrUajWePHmCoKAg/Oc//0F8fDxUKhWuXLmCkJAQnDt3DiqVCmfOnIGnpyeWL1+Ov/76y9BlF0qlUmHFihXw8/PDnj17xHuIBg8eLHYXLlq0CJ6envDz88P8+fNx7Ngxo92wpKenY/78+QgMDER4eLj4eZPJZIiNjRXHy8zMRGhoqNY9h6XpwYMHuH79eomno1AoxHvtND8qkJ2drXVOMzc3V/zRAWPfQKpUKmRnZ2vt1GVnZ+cLXWPe6aPyYZQBVlQKhUL88pbVIerbUKvVUCgUyMjI0NqAKJXKfBuUvH8zZkqlEgqFQiuUMjMzxe5CzbrQNGMNLw1NnZqNomad6W4kc3JySnQTemHUarVJrHsiY2XSAUZERP9cDDAiIjJJDDAiIjJJDDAiIjJJDDAiIjJJDDAiIjJJDDAiIjJJDDAiIjJJDDAiIjJJDDAiIjJJDDAiIjJJDDAiIjJJDDAi+sfLzMxEVFQUEhMT3zjuuXPn4OzsjHHjxuHcuXNawy5fvoyhQ4di+PDhRZ53TEwMtmzZgtu3b+cbdvToUfzwww+4d+/eG6dz8eJFrFmzBlevXi3SfDds2IDffvsNr169KnKtuhYvXoyIiAiDPZ6HAUZkZi5duoSoqCg8fvy42K89c+YMoqKi9G7UVqxYgSNHjhTpMSaLFi1CRESE+Gv7gYGBpbKRi4qKgr+/P06cOFHs12ZkZGDOnDmwt7dHXFyc1rBnz55h2rRpaNmy5Runc/LkSUgkErRr1w7nzp3D9evX4e/vj507d2Lfvn2QSCQYNmxYketKSkrC+PHj4ezsrPWk7Js3b2LYsGGQSqWYNm3aG0Ns9+7daNGiBUaOHKn3ic5btmzB3bt3xf+3a9cOUqk0Xwg3a9YMM2bMQI0aNSCVSt/YunbtarAnYpdZgMXFxUEulxcr3V1dXeHs7Gz0j+IwNQsWLMA333zzVhs0jTZt2mDr1q16H1tTv359dO7cGampqSUp06DS09O1nvv17NkzLFmyRNwjv3DhAt577z2cOXOmWNPV7JG3bt0ae/bsKdWaCzJixAhIpdK3mt/69evh4OCAixcvIjExEUFBQeJ6bdSoEaRSKZKTk984nSpVqsDLy0t8FI2VlRV8fX31Pj6me/fucHZ2fuOTvNVqNfz8/CCVShEQEFDsZdM8gdvOzi5fgN24cQMSiQQtWrQodBp3797F2LFjIZFI0LhxY0yfPh1t27aFRCIRN+i1atWCv78/gNdHawMGDEDdunXx9ddfF3h0FB0dDWdnZzg7O+PkyZMAXh8h1a9fH1OnTi3SEdigQYMgkUgwYsQIyGQy+Pv7i23AgAGoXr06xo8fL66/du3aYdKkSXj48KHWdFatWoVnz55BrVYX2Pr164eKFSvC09MTPXr0ML8ACwkJQeXKlYuU4JomkUggkUgK/KCbuz/++AO//fZbkccPDw/H9u3bC92g7N27F61bt8bgwYNx6dIl8e/nz5/HqlWrcPPmTfFvW7ZswYEDB8QHVmqsW7cOtWvXxtSpU/H06VMArz/kaWlpiI+PR61atdCpUydxQxcbG4uFCxcW+0msFStWLNKGrCzcu3cP1apVw4oVKwC83qDVrFkTa9asAfA6wOrUqYMNGzYUa7rR0dFo1aoV3n///XIJMM36lkgkRZ5fp06d8NFHH+Hq1atYv3496tSpg4sXL+LTTz+FjY0Nrl27hpUrV6J69eqYOXNmvs+HPvoCLO9GXtNkMpn43S/Kes/NzdUbYAqFAs7OzvDw8CjwtWlpaXBycsInn3ySb5ju+i5IbGwsGjZsiO+//x7h4eF477338OOPP+LJkydYuHAhunTpggsXLmDXrl2oU6cOhg4dCplMBplMho0bN2oFWHJyMrZv347w8HAAQEBAgBhgERERcHR0xNKlS6FWq3H9+nVERUXh/v37euu6dOkSunXrhmHDhmHPnj1YvXo1mjZtirZt22LGjBliDaGhoeL6KyjA3uTjjz+Gk5MTDh8+DKVSaZDvq8ZbBdj48eMxZ86cQvfoNQH24MEDMbVjYmJQuXJleHp6ik+OzdsWLFiAChUq6H2AYN69ibyH2ebkt99+Q/PmzTFw4EDxSb2nTp2Cv78/IiIiAAC3b9/Gli1b0K1bN3EjUNge2sKFC1G7dm20atVKq9tlx44daNq0KaRSKcaMGSPuoUmlUsTHx2tNQ7OH+ffffwMAEhISUK9ePXTs2BHOzs6wsrJCp06dMH/+fPj7+8PV1RUWFhbw9PTUCrHKlSvD29u7wCPsChUqQCKRGGTn5d69e6hatWqRAuz333/Hu+++i82bN79xuvv27dPaI9e1bt06fPLJJ4U+mTkyMhLbtm1DUlJSofO6fPkyXF1d0bJlSzg5OcHJyQkxMTFvrPH3339HixYtsHHjRixduhR16tTBlClTYG9vj8uXLwOAGGBvqkFDX4D5+PhApVLl+94LglDsAHN2dha3B35+fujWrRskEgkEQUCvXr20XpOZmYmgoCA8fvwYNWrUwKlTp5Ceno5FixYhPj4eaWlpmD59OmrWrCkeucyZMwf/+c9/0K5dO3E6Fy9ehLOzMz7++GNs3boVf/zxBwYOHIgff/wRv/32Gzp37ozz588DAHbt2oU2bdpg3759BS5LXFwcXF1dxe9xw4YN4eTkhEaNGqFJkyb47LPPxHo6duwIqVSK9evX652Wv78/7O3tsX//fgCvd1D/+9//YvTo0bh165Y4XufOnTFhwgTcv3+/WAGm6VGrXLky5syZYzQPEH6rAFu3bh0ePXpU6DiaAMv75uQ97NTsEVhYWIgbtcDAQL0B5uLiIh6daVpkZGSRalWr1Th+/Lg4v4ULFxZ/gYvh+fPn2LZtG/7973+jcePG2L59e7Fev379ekgkEkyfPh3A6wDr2bOn1rK7uLiIyyOTyQo8yau7QatVqxaGDRuGK1euiAGm+YB///33aNCgAT744AOtI7UJEybA1tYWkydPhr29PSQSCaZNmwaZTIbq1atDIpHgq6++QpUqVcQQ09QVHh6uFVbR0dGwsrJC165doVAo8p0XKc8AUyqVOHbsmFjrrFmzYGVlhY8//hhhYWGYPn06rK2t0atXL8hkMkyePBm2trZwcnJCu3btIJFI0LFjRwD/d06kuK1u3bpo1qwZJBIJZsyYobfOqKgodOvWDd27d0dsbGyhyzRmzBhIJBLs3LlT3CMPDAwUj5oLM2nSJOzcuVMMsP/85z+4c+cO1qxZA5lMBg8PD1SqVEkrwE6dOoXq1atj//79UCqViImJQWBgIGQyGSwtLeHl5QULCwt07doVgiDAx8dH77otSYBputsKk5qaKr7nlpaWcHJyQseOHcUdlpSUFDg5OcHDw0P8PMyePRsfffQRPvzwQwCvd3C++uorTJ06FXfu3BHfazc3N1y/fh1ffvklBg0apPW9lMlkWLduHX766SeEhobmq0sTYF26dMHx48fFv/v6+uZb39OnT4dEIikwwIYOHQqJRCIG2I8//oimTZvi2LFj+Ouvv7BixQokJSWhc+fOGD9+fLEDbNmyZahcuTJmz55tNOEFlEMXoubNiYmJQZUqVeDo6AgfHx/xQy6VSnHkyBHk5ubqDTAXFxdIpVJxb8vZ2Vn8MBalz/zYsWNaGw1BEODu7l5Wiw3gdb/32wbYmTNn0Lt3b3To0AFHjhwRA6xr165FDm2NRYsWoU6dOti5cycAQCaTwd7eHq1bt8aXX36pN8DWrFkjdjFs3LgRdevWxXfffYdXr17hm2++gZ2dHa5du4aEhAQ4ODhg9+7dyM7OxqBBg+Dk5PTG82AeHh6oUKECunbtCicnJ62A0w2wqKioYi9zUWVmZmod1RcUYIMGDUJUVBS2bNlS7C7E0NBQ2Nvbw8/P763r9Pf3h0QieWOABQUFoU6dOvDy8sLDhw+hVqtx8eJFdO3aFa1bt853zkfj22+/Rf/+/VG1alVMnDgRDg4OkEgkmDJlCmrVqqXVvd+hQwd4enrC3d0dlpaWkEgkmDNnDvz9/ZGZmYklS5aI76elpSW6dOkCX19f+Pv7i+tW93RB3u7EknQhao7m9ElNTYW1tTWCg4PFv2mOuBcvXoydO3eiXr16SEhIEIc/evQIX3zxhVaAffvtt+K8zp49iw8++ADt27fH3r17xeXWBNeQIUO0lnX8+PH56sobYBEREeIyFDfALl26JG4XNQE2b9481KxZE59++ikaN24MiUSC6OjoEgdYQQcuhupGLJcAi42NRdWqVTF37lxUqlQJBw8eREBAAKysrMTwAqA3wARByLcR03woZDJZgfNXq9UIDw+HVCpF9+7d4e/vDx8fH0gkElhYWGDRokVlstzA/wVYu3bt8NdffxX79fv378fq1asBoEgBpu/Le+XKFbi7u2PgwIE4f/68ONzHxwf29vYYOXKkuIcGAM7Ozvjggw9w4cIFAK/Px/3rX//Cpk2b8OrVK6xduxa9evWCjY0Npk2bJu6Rz5w5EzKZDG5ubrC0tESnTp2QlpZWaI0LFy6Ei4sLnJ2dtU42a9Zrbm4uoqKixC9lWYVYXsXpQtRdHn2uXbuG4cOHo0uX9NeGAgAAGMpJREFULrh48aLWsJSUFERGRr7xcudt27ahUaNGbwywpUuXwsHBAZ6ennj48CFGjBiBVq1a4eTJk7hw4QIcHR3Rpk0bbNq0CampqXrrVqvV+Oijj8RgmTJlCh4/fgy1Wo3Vq1ejRo0amDFjBp4/fw4AqFevHr7++usCL9LK24WoVqvFLkTNd7179+6QSqXIzc0t9LSA5qpDzft9/PjxfAGmVCrh5OQENzc3vdMoLMBkMhnmzZuHESNGaL1GN8A0YmNjUa1aNYwdOxZRUVE4d+6cVnfo48ePERkZKfZibN++/Y0BphvkmnXg6uoqfjc6dOhQYICNGDFCfI0mwHr37o1Ro0bh5s2b2Lp1Kxo2bPjGAMv7mV65cqUYxi9evBADbP/+/YiKisLChQu1jjQtLS1x+PDhcu/+L5cA+/jjj+Hs7Iz09HQsXrxYPKGru8D6Akzz4c1Ls1daWIDl5ubCz88PPXv2FP+Wk5MDLy8vSCQSVKlSpfQWVkd0dDQkEgl69OjxVq/P+0HSDTDd8wfXr1/H4MGD811mO27cOLRo0QKrVq1C9+7dxXNgFy5cELuFNEdg+/btwwcffIDPPvtMvMz2jz/+QFRUFF6+fAkAaN26Ndq3b485c+bk6ybRNFdXV1haWuY7NxoTEwNbW1txg3by5ElYWlrmuxxb01Xs5+dXLuc8lUoloqKiEBsbi+TkZNSuXRtxcXFQq9W4d+8ePvnkEyQkJECtVuP8+fNo27Yt1Go1rly5AicnJ0yePFnvdFNTU7F48WLxqjbd9+njjz+GRCLBxIkTC6wt71VphXUhhoSEoF69epg3bx4ePHgAAFoBBrwO34kTJ8LOzk7rpH7e7sBJkybB2dkZX3/9tdY5sC+//FLcWXmbADt+/DhcXV3zdSFWrFixSEfbUVFRWht4QRC0Pht5d0ytra0LXB/6AszKygru7u7ielm1apX4vXtTgM2cORPA6/u0JBIJmjdvLl79mfcy+qIEmKenp9bf9R2BrV69GvXq1csXYHv37hXrb9myJfbv34+dO3eiWbNmCAsLAwB89dVXcHJywrlz5woMsNOnT6NRo0aYNm1avvfX399f3EHt3LkzvLy8tIb17NkTFStW1OpNKy/lEmBLly5FZmYm1Go1evfuLS7soUOHkJOTI35oCjoHpksmk0EikRS6YVOr1Thx4kS+PvKMjIwyDbDnz59j1apVaNSoEbZt2wa1Wo3c3Fzk5uYWusd+9uxZhIaG4sCBA2jWrJl4Yl8TYA0aNMCYMWPELlXNl1oQBLGtXbsWarUawcHBqFu3LrZt2wbg9Yf8/fffx5AhQ8ST8nlP8vr7+6NRo0aFnk/QXNmmOf+l70NepUoVSCQSvRf3REdHo1KlSvDy8oKfnx9cXFzyreeAgABxr7w8aC6r1n0fNU33Pa5bty5mz54tngOrX78+tmzZkm+68fHxaNOmDezs7DB48GCt92j//v0ICwvDv/71rwID7M6dOxg3bhzGjBmD77//Xm+AqdVqLF++HM7Ozjh48KDW63UDTOPHH3/Ee++9B6lUirFjxyIpKQlqtRqbNm3CO++8g99//13rKsQxY8bA1tZW7DrUXMQREhKCKlWqYPbs2fkCTLNjVaVKFUilUvH8tpWVFby9vcWLODQBplKpxKNtqVSqN8QkEkmBF8EAQHZ2dpECLCgoCGq1GtnZ2fj5559hZWWFoUOHIisrCzt37oSNjQ1Gjx4NoPAAa9iwIbZu3QrgdYA1bdoUO3bsAIB894EVJcA0XYia7YSPjw9cXFwQHR0tbjcOHTqE9u3b5wuw0aNH46effsLPP/8sBtj8+fNhZ2eHJUuWIDU1Fd27dxfXN8+BFVHeANNsxPv9v/bONKip6+/jyQ1JkM0latURFatYRRAFLXUhIATBEavDuKC4KzitoxVtVcqWgBENVmDUsa3SaUelos64YKuCFBA3tAjaWm0VHdfRtlBEgXCTfJ8XPOc0l5tA1NLRf+9n5rxIcnOTu53vOb/thIdDKpVizZo1KCgogKOjI0QiEeLi4qhTXyKRQK/XW92vyWSiTtyXsbs+e/YMEokEEydOfJXDswrJE+nXrx8yMzORnp4OsViMrl27YunSpTxzEiE7Oxu+vr4IDw+HWCyGn58fTpw4YdGEWFhYiHHjxiEtLY23n6NHj8LHx4czIgeAmTNnQq1W4/Hjx7STCQ0NpT6w8ePHw9vbm5fUSBg6dCh8fX1x+/ZtZGRk4Pfff4fBYOC0KVOmWJyBEcLCwpCYmAg7OzvExcXRwQtpxIxoLmAmkwkGg6FdRK26uhr+/v6IiIjgmQQthVWbTCY8fPgQ0dHR8PDwQHl5OW+fZWVl8PT0BMMwGDRoEHJycniz5vLycoSHh1sUMJPJBK1WS0O1LQVx/Prrr4iIiMCkSZNw6dIl3j6ISclSGH1lZSWKioqomXfXrl3o06cPduzYgadPn2LhwoVQKpWoqqqCyWTCnDlzsHbtWlRXV6Nfv364c+cO0tPT4ezszLm/AMBgMGD9+vUIDg6GRCLhRSGSsHm1Wk19YuQ1aZYSlP8JAROJRHBycoJarcann36K0aNHc0zGJJG5T58+uHDhAh4/foyYmBibBWz37t0wmUw4ePAgunXrRk2ctgiYWCyGRCKhzXy2OWDAACxevBizZ8+2OAMjEAHTaDSIiYnBihUrMGDAAERFRcHNzQ2ZmZn466+/BAGzFSJgDx48QElJCSZOnIjAwEAEBgbC398fx48fR1FRERwcHMAwDJRKJRISEiCRSJCfn2/VTp/0/3kjL2NWYlkW69atQ4cOHWwKL34Zrl69Cm9vbwQEBODPP/+ETqeDn58f9S21BQniaBmF6O/vT4+5NQHLy8vD3r178eDBAzp6I+3KlSsYM2YMUlNTaZ4IEbCKigoMGzYM3t7eFkV26NChvAetZSOzltbSK4qLiyGXy+Hv74+EhARq/khMTIRSqYRYLOaIYmFhIRiGgb+/P29fryJu9fX1+Pjjj9GlSxcUFRWhsLAQpaWl9Hdv3LiBLl26IDMzEwaDAbW1tThy5AhiY2Otzpxu3bqFqKgo+Pn5IS0tDSKRCIMHD+Z00Gq1GlOnToVYLLa4n9LSUgQFBSE+Ph4APwrx5s2b2LlzJ/bs2WM1dcLaDMwS5eXlOHXqFGpqalBWVoYBAwZg6dKlOHLkCDZs2IC8vDyapOrm5oYVK1ZApVJBLpfzBEyhUIBhGMTFxdEoxJZh9JZ8YG35E4nQWUuqbWhoeCkTYksBW758Obp164Zt27ahqqoKI0aMsEnAunTpgoiICKjVasycORNDhgxBbm4ugNYF7Ny5c5gwYQKioqI4oe7mJkRyvefMmYPAwEAcPnzY4vnKzc3FkCFDEBkZSX2rEydOpGJIBgYtBSw6OloQMEsQAZNIJDR0njwInTp1wpgxY+hrrVbLCaMnETktKSgoAMMwFiOQyPS7NXNdXV0dGIZpt9kX0Ozv6dixI+bOnQudTgcfHx+aG0I6XJZlaSMmFUJLASMdWlxcHN2mNQEDms9979696UOlVquRnJyMIUOGQCwWY9asWUhOTuYIGNA8C3R1dcXWrVvx9OlTzj7JDKyqqorz/83bxo0b4eTk1KqAaTQayGQyJCQkcDp1YkIiI3I7OzvY2dnRz+3s7Hj7OnXqFEQiEQICAmy8On9TX1+P+Ph4REREoK6uDrGxsRCJRPR3yQyBYRj6HsMw6NGjB7744gve/qqrq5Geno5Ro0bhypUryMvLg0KhQEJCAm/by5cvY/LkyTwBu3fvHmJiYhAZGYnffvsNLMuioKAA48aNQ2BgIIqLi3n3iyUiIyMRERFB8/Za4/Lly/D09KQjf4ZhaAQiSecgkaWRkZHUf7169WrqHyWUlpaiqKgIBoOBE8RhNBqpCVGv18NoNFJTOMuyOHXqVKvFC0QiEZRKJW8gQBqpzuHo6Gjx+7YIGDn/8+fPB9A8EBWJRPDx8eEdo7UZGPB33h/xz584cQLvvPMOR8CMRqPF54cMnlqaEEkzGAy4du0atm/fjosXL3Lug9zcXCQlJVEXAfmd4OBgzJs3D3fu3AEAjB07lpMHNmLECE4xA2v8ZwWM5IgAoBdCq9XC0dGR9wC05gNjWRYMwyAoKIj3ABcWFiIhIYG2xMRE3gytoaEBY8eOhYuLyz97oGbU1tYiKysLHTt2hLe3N8RiMVQqFf38+vXrmDFjBies38vLC4cOHaLbtBQwnU5HfQnmx9uagAF/izo5V1evXoVSqYSXlxfOnj2LnJwcDBw40KKALVq0iDe69/Lyor5LsVgMOzs7SKVSSKVSTmc/btw41NTU8AYR5KF1cHBAfHw8J3zeZDIhMDAQEokEP/zwg82mYeILtSRuLwIRMFdXV/peSxMi8YkMHDgQP/74I+f7NTU12Lx5M0aOHEkHK3l5eXB3d8fevXthMBjQ1NRE28WLFzFp0iSegJEReUtfHDnnEokEoaGhnHBvS0RGRmLw4ME2zcAIFy9ehLu7O2JiYvDo0SN4eHiAYRhcv36dbnP+/Hl0794dIpHIakUIgrmApaamws7Ojs6wk5KSIJfLIZVKOeZEa+WhJBIJgoODeQJHXjc1NUGlUkGj0Vi8d2wVMHOsVV6xNgNbs2YNjEYjDhw4ALFYTKMaKysr8f7773MEbNu2bfTZMW9vv/02goKC4Obmhv79+2PRokXQaDS0zZkzB3369KHbm6fotBQwo9GIVatWQaFQcPyK2dnZOHr0KJ4+fUp9udbcBub8ZwXMfHqalpaGpKQkxMfHo66ujidURMBaliBiWRZKpZIjXiaTifrKyKieNLlczklYbmpqwtq1a+Ho6NhupkOgeQS3YMEC9O3bF7GxsfD29oZKpaL/+caNG5g9ezbnv4aFhXE6CXMBIwEZLUPobRGw69evY/v27SgvLwfLstQsYX78xAd28+ZNGAwGfPnll+jduzeWLFlCTZBkVLh161bk5eXB1dUVI0eOxN27d+lnOp0Ozs7OiI2NRW1tLViWhVarxffff0+FSqvVIjAwEAzD4MSJE5zOqKCggM62SKi0LfUwi4qKIJPJOIOEl+FFBGz48OG8TrKkpAQjR47kdAR5eXkQi8Xw8PBAZGQk55pLpVIwDMMTsPv372P37t2cTmvBggW0MoNWq7WpDmFrPjBr7Ny5E71790Z0dDQOHTqEvn37Yvny5ZwkaJZl4erqCpFI1GZFDnMBU6vVCA4ORmJiIhiG4V1bElXc8rwSi0VKSgqAZtMaSXw3Go1ISkqi+2poaICjoyMKCwt5RYOJgG3YsAF6vR56vR63b9/mCZj59yorK20WMIVCgWnTpkGj0WDWrFnw9PSk576iogKTJ0+2aEK0hqUoxLbYt28f4uPjce3aNRiNRnz99ddwd3fHZ599ZjGtBbBezJfAsiz0ej0MBgM2bdr02lXhAP5lAdPpdEhJSYGLiwvs7OwwZswYzskgAmZuTiA5HiKRCA0NDWhsbERjYyNOnjwJsVjc5v8wGAw4duwYz+/V1NT0jy8B8PPPP2PYsGHw9/fH7du3MXfuXPj4+ODy5ct09tkWZWVlCAsLw7Jly1BaWoqFCxfyTFa2CNiNGzewatUq6nPs2rUr9u/fz9mGCFhycjISEhLg6uoKiURCR/iff/459VFpNBokJydDoVBALBZj5cqVSElJQUpKCkJDQyGTyWiSelhYGJycnCCXy+nDs3HjRnTo0AEikYhT+LOpqQlyuRxBQUH0/ISEhECpVKKhoeFfiUhsS8CMRiMePnyImJgYDBw40KaCvnl5eRg0aBC+/fZb3mfEhLhkyZI2j+9FKnEQXkbAgGYRmzRpEg2uqqiooKLS1NSEadOmwdnZGVKpFH5+fnj06BHn/5vf40TAnj9/DgcHBxQUFECtVr+QgBUUFFBTHIlcJCZZlmUhk8kwfvx46gc9efIk7O3todFoOM82CeKws7ODXC6HXC6HTCaDi4sLMjMzATSbgDMzM6HX63H//n1ER0ejZ8+evHJhLQUsPz8fY8aMoT7uP/74A8XFxfjpp5/Q2NhI74PFixfbfB1eRsCSkpLQrVs3HDx4ELt378bgwYORnp6O6upqznbEGtDY2Ijhw4fD19fXqgkxKioKLi4u+OijjxAcHAy5XI7Dhw+3GSX+b9LuAnbv3j2L9t7U1FTIZDJaL49lWWpOMBcwpVLJ8UO0bK1BxEsikSApKQkNDQ1oaGhATU0NAgIC/vFk5jNnzqBjx45YsWIF7ty5gwULFsDNzQ2bN29Gbm4u9u3bZ/W7JpMJLMviwIEDGDRoEPz8/KBSqTBz5kyOgxewTcAIaWlp6NmzJ8RiMXJycjgdDhGwQ4cOwcfHBzKZDNHR0dR8uHPnTipST548oZU43nvvPTx8+JDuZ8uWLXB2dm41LwgA1q9fD6lUSgWMZVmMHz8eKpWKN5gICQmBSCRqNa/EaDSioaGh1ahVW2hNwDZu3IjvvvsOsbGxGDFiBHr27EkrMrSGJQEj1/jSpUsIDw+Hr68vjh071up+ioqKoFQq213AjEYjmpqasHDhQnTp0oVWybl69Sr0ej1mzpwJZ2dn3L17F+fPn6f3VG5uLr3mp0+fRn5+Pp49ewZnZ2d88sknCAgIQFBQEJqamqDRaMAwDJ4/fw6WZelzT/K4zAVMr9dj3LhxnFxP8xkcmalLJBI6Q2NZFomJiZDJZNBoNPR7ZAaWnp5O33vw4AFcXV3pagM1NTWIi4vD6NGjwTAMXFxcEBMTwztPRMBIioo19u/fT89hr169oNPpbL4WLyNg06dPh4eHB5YvX44ZM2agrKzM4nZfffUVIiIi0KlTJzAMgw8//LDNsoCRkZFwcXGBUqmkeYCvC+0uYOQmTE1N5TQySg8ODoZGo0FqaiqCgoKojZx0Wo6OjggJCeF9nzRrmEwmmmRoSfjs7e05NvFX5enTp9i+fTvc3Nzo6KywsBAymQxvvfUWjSqzBqm11qdPH8yfP5+mHKxcuZJ20kT8CwoKoFQqkZaWBpZl0djYiPr6eqtmN61Wi549e/L8IuZh9N988w2OHj1qtdK40WhERkYGunbtij179nBmUefPn4dCoXghAWNZFklJSZBIJKitrUV9fT2nNTY20nw3Ui2kJQUFBdTB/yrU1dVh9erVcHNzo++Zz8BI/oxUKsWoUaNs2qclAbt69SqSk5OxZMkSuLu7Izw83OK6TebcuXMHixYtQlhYmNVyUC15EQEjQUVnz55FZGQkVCoVqqqqUFZWBjc3N/j4+CAoKAgqlQpHjhyhyeeklJhUKkVgYCBqa2tx5swZhIeHw97enj5ncrkcJ0+ehNFopAKmUqmQkpICBwcHpKSkQCqV8gTM398fDMNwnvHk5GRIpVKsX78ewN+z9w0bNtBtnj9/DrlcDoVCQd+rrq6mSeptcffuXYSEhFiNND179izPXGyNwsJCeHp6Ijw83OZFJoHm4wwNDbX5egPNs6URI0bgzJkzNm2/bNkyhISE4ObNmzb/xutIuwnYli1b0Llz5xeacqalpcHZ2ZlWnHgVyAPj7OzMEz21Wo0pU6a80v5bUldXh7y8PGRlZdHyUTU1NTh8+DBycnLa/D6pRZiRkQGgeYSYnp4ODw8P9O/fH1FRUYiLi7PY3n33Xcjl8lbr9KWkpKBXr16cgBFzAbMEGZU3Njbi9OnT6N+/P8aOHcsL8GBZlq53ZKuApaWlQSKRQCqVQi6Xw8HBgTZ7e3tMmDABDg4OtG6ipftBrVbT0mCvgl6vR35+Pi3fBfB9YE+ePEFGRgYvgMMax44dg4eHBw2nJvvYtm0bvLy8IJPJ8MEHH7zS/7bGvHnz4ODgQMsKtUZ2djaSk5PRv39/LFu2jJr8y8rKMH36dCgUCuTk5FhcGufcuXPYtGkTzyei0+nos1ZUVEQHo6mpqZDL5byB1vr16+Hg4MC5xo6OjryapSUlJVS8gOb701y8yHslJSUvNHtpL548eYKSkpIXEi+gecUJ84UnBazTbgJ24cIF6HS618rh9zpTUVGBXbt2WVxWIzc3Fx4eHnBycrLYPD09LVa7NueXX37hrUcUGhqKefPm4baFpcyB5k5s06ZNmDJlCrp3747Y2FiLxXqzsrKgUCiwbt26Vq+3TqdD586d6exNoVBAo9GguLiY03mZ+ypJCRtLAlZcXAwnJ6d2SYu4desWevTo8cLrfxFu3ryJHTt2cCr7EyorK61e63+biooKZGVlcUzCQPMSK1u2bPlHFyktLS2FVqv9T671J9A+tJuACbz+TJ06FVlZWVajlLKzs6HVanH8+PE2ByJZWVkvtPq2rZSUlLRr4WVr1NTUvLR4CQgI/DsIAibwxtKyGLCAgMB/C0HABN5YbInCFBAQ+N9FEDABAQEBgTcSQcAEBAQEBN5IBAETEBAQEHgjEQRMQEBAQOCNRBAwAQEBAYE3EkHABAQEBATeSAQBExAQEBB4I/k/VWihR2VhypcAAAAASUVORK5CYII="
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![%E5%9B%BE%E7%89%87.png](attachment:%E5%9B%BE%E7%89%87.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 海伦约会"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def file2matrix(filename):\n",
    "    fr = open(filename)\n",
    "    arrayOLines = fr.readlines()  # 每行数据作为一个列表元素\n",
    "    numberOfLines = len(arrayOLines)  # 行数\n",
    "    \n",
    "    returnMat = zeros((numberOfLines, 3))  # 构造一个同等规格的零列表\n",
    "    classLabelVector = []  # 标签列表\n",
    "    text2digit = {'largeDoses': 3,\n",
    "                 'smallDoses': 2,\n",
    "                 'didntLike': 1}  # 将标签转化为数字\n",
    "    index = 0\n",
    "    for line in arrayOLines:\n",
    "        line = line.strip()  # 去除两边空格\n",
    "        listFromLine = line.split('\\t')  # 将一行中的数据分成列表数据\n",
    "        returnMat[index, :] = listFromLine[0: 3]  # 复制前三列的数据（即不含标签列）\n",
    "        classLabelVector.append(text2digit[listFromLine[-1]])  # 复制最后一列数据（即标签列）\n",
    "        index += 1\n",
    "    return returnMat, classLabelVector"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "filename = 'datingTestSet.txt'\n",
    "datingDataMat, datingLabels = file2matrix(filename)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[4.0920000e+04, 8.3269760e+00, 9.5395200e-01],\n",
       "       [1.4488000e+04, 7.1534690e+00, 1.6739040e+00],\n",
       "       [2.6052000e+04, 1.4418710e+00, 8.0512400e-01],\n",
       "       ...,\n",
       "       [2.6575000e+04, 1.0650102e+01, 8.6662700e-01],\n",
       "       [4.8111000e+04, 9.1345280e+00, 7.2804500e-01],\n",
       "       [4.3757000e+04, 7.8826010e+00, 1.3324460e+00]])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "datingDataMat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[3, 2, 1, 1, 1, 1, 3, 3, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "datingLabels[0: 20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x400 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "### 绘图参考：https://www.cnblogs.com/pengsky2016/p/8126623.html\n",
    "zhfont = matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/simsun.ttc',size=12)\n",
    "plt.figure(figsize=(8, 5), dpi=80)\n",
    "axes = plt.subplot(111)\n",
    "\n",
    "# 将三类数据分别取出来，即分别统计各类样本的数据\n",
    "# x轴代表 每年获得的飞行常客里程数\n",
    "# y轴代表 玩视频游戏所耗时间百分比\n",
    "type1_x = []\n",
    "type1_y = []\n",
    "type2_x = []\n",
    "type2_y = []\n",
    "type3_x = []\n",
    "type3_y = []\n",
    "\n",
    "for i in range(len(datingLabels)):\n",
    "    if datingLabels[i] == 1:  # 不喜欢\n",
    "        type1_x.append(datingDataMat[i][0])\n",
    "        type1_y.append(datingDataMat[i][1])\n",
    " \n",
    "    if datingLabels[i] == 2:  # 魅力一般\n",
    "        type2_x.append(datingDataMat[i][0])\n",
    "        type2_y.append(datingDataMat[i][1])\n",
    " \n",
    "    if datingLabels[i] == 3:  # 极具魅力\n",
    "        type3_x.append(datingDataMat[i][0])\n",
    "        type3_y.append(datingDataMat[i][1])\n",
    " \n",
    "type1 = axes.scatter(type1_x, type1_y, s=20, c='red')\n",
    "type2 = axes.scatter(type2_x, type2_y, s=40, c='green')\n",
    "type3 = axes.scatter(type3_x, type3_y, s=50, c='blue')\n",
    "\n",
    "plt.xlabel(u'每年获得的飞行常客里程数', fontproperties=zhfont)\n",
    "plt.ylabel(u'玩视频游戏所耗时间百分比', fontproperties=zhfont)\n",
    "axes.legend((type1, type2, type3), (u'不喜欢', u'魅力一般', u'极具魅力'), loc=1, prop=zhfont)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 归一化数据\n",
    "def autoNorm(dataSet):\n",
    "    minVals = dataSet.min(0)  # 返回每一列最小的元素组成的列表，若参数1表示每行\n",
    "    maxVals = dataSet.max(0)\n",
    "    ranges = maxVals - minVals\n",
    "    \n",
    "    normDataSet = zeros(shape(dataSet))\n",
    "    m = dataSet.shape[0]  # 获取行数\n",
    "    normDataSet = dataSet - tile(minVals, (m, 1))\n",
    "    normDataSet = normDataSet / tile(ranges, (m, 1))\n",
    "    return normDataSet, ranges, minVals"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "normMat, ranges, minVals = autoNorm(datingDataMat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.44832535, 0.39805139, 0.56233353],\n",
       "       [0.15873259, 0.34195467, 0.98724416],\n",
       "       [0.28542943, 0.06892523, 0.47449629],\n",
       "       ...,\n",
       "       [0.29115949, 0.50910294, 0.51079493],\n",
       "       [0.52711097, 0.43665451, 0.4290048 ],\n",
       "       [0.47940793, 0.3768091 , 0.78571804]])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "normMat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([9.1273000e+04, 2.0919349e+01, 1.6943610e+00])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ranges"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.      , 0.      , 0.001156])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "minVals"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "def datingClassTest():\n",
    "    hoRotio = 0.1\n",
    "    datingDataMat, datingLabels = file2matrix('datingTestSet.txt')  # 导入数据\n",
    "    normMat, ranges, minVals = autoNorm(datingDataMat)  # 归一化数据\n",
    "    \n",
    "    m = normMat.shape[0]\n",
    "    numTestVecs = int(m * hoRotio)\n",
    "    errorCount = 0.0\n",
    "    for i in range(numTestVecs):\n",
    "        dataSet = normMat[numTestVecs:m, :]\n",
    "        labels = datingLabels[numTestVecs:m]\n",
    "        classifierResult = classify0(normMat[i, :],\n",
    "                                     dataSet,\n",
    "                                     labels,\n",
    "                                     3)\n",
    "        classifierResult = int(classifierResult)\n",
    "        print('the classifier came back with: %d, the real answer is: %d' %\n",
    "             (classifierResult, datingLabels[i]))\n",
    "        if (classifierResult != datingLabels[i]):\n",
    "            errorCount += 1.0\n",
    "    print('the total error rate is: %f' % (errorCount / float(numTestVecs)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 3, the real answer is: 2\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 3, the real answer is: 2\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 3, the real answer is: 2\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 3, the real answer is: 1\n",
      "the classifier came back with: 3, the real answer is: 1\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 3, the real answer is: 2\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 3, the real answer is: 1\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 3, the real answer is: 1\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 2, the real answer is: 3\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 2, the real answer is: 2\n",
      "the classifier came back with: 1, the real answer is: 1\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 3, the real answer is: 3\n",
      "the classifier came back with: 3, the real answer is: 2\n",
      "the classifier came back with: 2, the real answer is: 1\n",
      "the classifier came back with: 3, the real answer is: 1\n",
      "the total error rate is: 0.120000\n"
     ]
    }
   ],
   "source": [
    "datingClassTest()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "def classifyPerson():\n",
    "    resultList = ['not at all', 'in small doses', 'in large doses']\n",
    "\n",
    "    precentTats = float(input('percentage of time spent playing video games?'))\n",
    "    ffMiles = float(input('frequent flier miles earned per year?'))\n",
    "    iceCream = float(input('liters of ice cream consumed per year?'))\n",
    "    \n",
    "    datingDataMat, datingLabels = file2matrix('datingTestSet.txt')\n",
    "    normMat, ranges, minVals = autoNorm(datingDataMat)\n",
    "    inArr = array([ffMiles, precentTats, iceCream])\n",
    "    inArr = (inArr - minVals) / ranges\n",
    "    \n",
    "    classifierResult = int(classify0(inArr, normMat, datingLabels, 3))\n",
    "    print('You will probably like this person: ', resultList[classifierResult-1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "percentage of time spent playing video games?12\n",
      "frequent flier miles earned per year?44000\n",
      "liters of ice cream consumed per year?0.5\n",
      "You will probably like this person:  in large doses\n"
     ]
    }
   ],
   "source": [
    "classifyPerson() # 12 44000 0.5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 手写识别系统"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将图像文本转化为向量\n",
    "def img2vector(filename):\n",
    "    returnVect = zeros((1, 1024))\n",
    "    fr = open(filename)\n",
    "    for i in range(32):\n",
    "        lineStr = fr.readline()\n",
    "        for j in range(32):\n",
    "            returnVect[0, 32*i+j] = int(lineStr[j])\n",
    "    return returnVect"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "testVector = img2vector('testDigits/0_13.txt')\n",
    "testVector[0, 32:63]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "from os import listdir"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "def handwritingClassTest():\n",
    "    hwLabels = []\n",
    "    trainingFileList = listdir('trainingDigits')  # 获取该文件夹下所有文件名称\n",
    "    m = len(trainingFileList)\n",
    "    trainingMat = zeros((m, 1024))\n",
    "    for i in range(m):  # 遍历每一个文件\n",
    "        fileNameStr = trainingFileList[i]  # 例如0_0.txt\n",
    "        fileStr = fileNameStr.split('.')  # 将名称与后缀分离，如['0_0', 'txt']\n",
    "        classNumStr = int(fileStr[0].split('_')[0])  # 将文本数字提取出现，如0\n",
    "        hwLabels.append(classNumStr)\n",
    "        trainingMat[i, :] = img2vector('trainingDigits/%s' % fileNameStr)\n",
    "        \n",
    "    testFileList = listdir('testDigits')\n",
    "    errorCount = 0.0\n",
    "    mTest = len(testFileList)\n",
    "    for i in range(mTest):\n",
    "        fileNameStr = testFileList[i]  # 0_0.txt\n",
    "        fileStr = fileNameStr.split('.')[0]  # 0_0\n",
    "        classNumStr = int(fileStr[0].split('_')[0])  # 0\n",
    "        vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)\n",
    "        \n",
    "        classifierResult = int(classify0(vectorUnderTest, trainingMat, hwLabels, 3))\n",
    "#         print('the classifier came back with: %d, the real answer is: %d' % (classifierResult, classNumStr))\n",
    "        if classifierResult != classNumStr:\n",
    "            errorCount += 1.0\n",
    "    print('the total number of error is: %d' % errorCount)\n",
    "    print('the total error rate is: %f' % (errorCount / float(mTest)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "the total number of error is: 23\n",
      "the total error rate is: 0.024313\n"
     ]
    }
   ],
   "source": [
    "handwritingClassTest()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
